{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Building Custom Skills for Claude\n",
    "\n",
    "Learn how to create, deploy, and manage custom skills to extend Claude's capabilities with your organization's specialized knowledge and workflows."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Table of Contents\n",
    "\n",
    "1. [Introduction & Setup](#introduction)\n",
    "2. [Understanding Custom Skills Architecture](#architecture)\n",
    "3. [Example 1: Financial Ratio Calculator](#financial-ratio)\n",
    "4. [Example 2: Company Brand Guidelines](#brand-guidelines)\n",
    "5. [Example 3: Financial Modeling Suite](#financial-modeling)\n",
    "6. [Skill Management & Versioning](#management)\n",
    "7. [Best Practices & Production Tips](#best-practices)\n",
    "8. [Troubleshooting](#troubleshooting)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. Introduction & Setup {#introduction}\n",
    "\n",
    "### What are Custom Skills?\n",
    "\n",
    "**Custom skills** are specialized expertise packages you create to teach Claude your organization's unique workflows, domain knowledge, and best practices. Unlike Anthropic's pre-built skills (Excel, PowerPoint, PDF), custom skills allow you to:\n",
    "\n",
    "- **Codify organizational knowledge** - Capture your team's specific methodologies\n",
    "- **Ensure consistency** - Apply the same standards across all interactions\n",
    "- **Automate complex workflows** - Chain together multi-step processes\n",
    "- **Maintain intellectual property** - Keep proprietary methods secure\n",
    "\n",
    "### Key Benefits\n",
    "\n",
    "| Benefit | Description |\n",
    "|---------|-------------|\n",
    "| **Expertise at Scale** | Deploy specialized knowledge to every Claude interaction |\n",
    "| **Version Control** | Track changes and roll back if needed |\n",
    "| **Composability** | Combine multiple skills for complex tasks |\n",
    "| **Privacy** | Your skills remain private to your organization |\n",
    "\n",
    "### Prerequisites\n",
    "\n",
    "Before starting, ensure you have:\n",
    "- Completed [Notebook 1: Introduction to Skills](01_skills_introduction.ipynb)\n",
    "- An Anthropic API key with Skills beta access\n",
    "- Python environment with the local SDK installed"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Environment Setup\n",
    "\n",
    "Let's set up our environment and import necessary libraries:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import sys\n",
    "from pathlib import Path\n",
    "from typing import Any\n",
    "\n",
    "# Add parent directory for imports\n",
    "sys.path.insert(0, str(Path.cwd().parent))\n",
    "\n",
    "from anthropic import Anthropic\n",
    "from anthropic.lib import files_from_dir\n",
    "from dotenv import load_dotenv\n",
    "\n",
    "# Import our utilities\n",
    "from file_utils import (\n",
    "    download_all_files,\n",
    "    extract_file_ids,\n",
    "    print_download_summary,\n",
    ")\n",
    "\n",
    "# We'll create skill_utils later in this notebook\n",
    "# from skill_utils import (\n",
    "#     create_skill,\n",
    "#     list_skills,\n",
    "#     delete_skill,\n",
    "#     test_skill\n",
    "# )\n",
    "\n",
    "# Load environment variables\n",
    "load_dotenv(Path.cwd().parent / \".env\")\n",
    "\n",
    "API_KEY = os.getenv(\"ANTHROPIC_API_KEY\")\n",
    "MODEL = os.getenv(\"ANTHROPIC_MODEL\", \"claude-sonnet-4-5\")\n",
    "\n",
    "if not API_KEY:\n",
    "    raise ValueError(\n",
    "        \"ANTHROPIC_API_KEY not found. Copy ../.env.example to ../.env and add your API key.\"\n",
    "    )\n",
    "\n",
    "# Initialize client with Skills beta\n",
    "client = Anthropic(api_key=API_KEY, default_headers={\"anthropic-beta\": \"skills-2025-10-02\"})\n",
    "\n",
    "# Setup directories\n",
    "SKILLS_DIR = Path.cwd().parent / \"custom_skills\"\n",
    "OUTPUT_DIR = Path.cwd().parent / \"outputs\"\n",
    "OUTPUT_DIR.mkdir(exist_ok=True)\n",
    "\n",
    "print(\"✓ API key loaded\")\n",
    "print(f\"✓ Using model: {MODEL}\")\n",
    "print(f\"✓ Custom skills directory: {SKILLS_DIR}\")\n",
    "print(f\"✓ Output directory: {OUTPUT_DIR}\")\n",
    "print(\"\\n📝 Skills beta header configured for skill management\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": "## 2. Understanding Custom Skills Architecture {#architecture}\n\n### Skill Structure\n\nEvery custom skill follows this directory structure:\n\n```\nskill_name/\n├── SKILL.md           # REQUIRED: Instructions with YAML frontmatter\n├── *.md               # Optional: Any additional .md files (documentation, guides)\n├── scripts/           # Optional: Executable code\n│   ├── process.py\n│   └── utils.js\n└── resources/         # Optional: Templates, data files\n    └── template.xlsx\n```\n\n**Important:** \n- **SKILL.md is the ONLY required file** - everything else is optional\n- **Multiple .md files allowed** - You can have any number of markdown files in the top-level folder\n- **All .md files are loaded** - Not just SKILL.md and REFERENCE.md, but any .md file you include\n- **Organize as needed** - Use multiple .md files to structure complex documentation\n\n📖 Read our engineering blog post on [Equipping agents for the real world with Skills](https://www.anthropic.com/engineering/equipping-agents-for-the-real-world-with-agent-skills)\n\n### Skills Are Not Just Markdown\n\n![Skills Can Include Scripts and Files](../assets/not-just-markdown.png)\n\nSkills can bundle various file types:\n- **Markdown files**: Instructions and documentation (SKILL.md, REFERENCE.md, etc.)\n- **Scripts**: Python, JavaScript, or other executable code for complex operations\n- **Templates**: Pre-built files that can be customized (Excel templates, document templates)\n- **Resources**: Supporting data files, configuration, or assets\n\n### SKILL.md Requirements\n\nThe `SKILL.md` file must include:\n\n1. **YAML Frontmatter** (name: 64 chars, description: 1024 chars)\n   - `name`: Lowercase alphanumeric with hyphens (required)\n   - `description`: Brief description of what the skill does (required)\n\n2. **Instructions** (markdown format)\n   - Clear guidance for Claude\n   - Examples of usage\n   - Any constraints or rules\n   - Recommended: Keep under 5,000 tokens\n\n### Additional Documentation Files\n\nYou can include multiple markdown files for better organization:\n\n```\nskill_name/\n├── SKILL.md           # Main instructions (required)\n├── REFERENCE.md       # API reference (optional)\n├── EXAMPLES.md        # Usage examples (optional)\n├── TROUBLESHOOTING.md # Common issues (optional)\n└── CHANGELOG.md       # Version history (optional)\n```\n\nAll `.md` files in the root directory will be available to Claude when the skill is loaded.\n\n### Bundled Files Example\n\n![Bundled Files in Skills](../assets/skills-bundled-files.png)\n\nThis example shows how Skills can bundle multiple files:\n- **SKILL.md**: Contains the main instructions with colors, typography, and sections\n- **slide-decks.md**: Additional documentation for specific use cases\n- **Scripts and resources**: Can be referenced and used during skill execution\n\n### Progressive Disclosure\n\nSkills load in three stages to optimize token usage:\n\n| Stage | Content | Token Cost | When Loaded |\n|-------|---------|------------|-------------|\n| **1. Metadata** | Name & description | name: 64 chars, description: 1024 chars | Always visible |\n| **2. Instructions** | All .md files | <5,000 tokens recommended | When relevant |\n| **3. Resources** | Scripts & files | As needed | During execution |\n\n### API Workflow\n\n```python\n# 1. Create skill\nskill = client.beta.skills.create(\n    display_title=\"My Skill\",\n    files=files_from_dir(\"path/to/skill\")\n)\n\n# 2. Use in messages\nresponse = client.beta.messages.create(\n    container={\n        \"skills\": [{\n            \"type\": \"custom\",\n            \"skill_id\": skill.id,\n            \"version\": \"latest\"\n        }]\n    },\n    # ... rest of message parameters\n)\n```\n\n### Best Practices\n\nFor detailed guidance on skill creation and best practices, see:\n- [Claude Skills Best Practices](https://docs.claude.com/en/docs/agents-and-tools/agent-skills/best-practices)\n- [Skills Documentation](https://docs.claude.com/en/docs/agents-and-tools/agent-skills/overview)"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Create Skill Utility Functions\n",
    "\n",
    "Let's create helper functions for skill management:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def create_skill(client: Anthropic, skill_path: str, display_title: str) -> dict[str, Any]:\n",
    "    \"\"\"\n",
    "    Create a new custom skill from a directory.\n",
    "\n",
    "    Args:\n",
    "        client: Anthropic client instance\n",
    "        skill_path: Path to skill directory\n",
    "        display_title: Human-readable skill name\n",
    "\n",
    "    Returns:\n",
    "        Dictionary with skill_id, version, and metadata\n",
    "    \"\"\"\n",
    "    try:\n",
    "        # Create skill using files_from_dir\n",
    "        skill = client.beta.skills.create(\n",
    "            display_title=display_title, files=files_from_dir(skill_path)\n",
    "        )\n",
    "\n",
    "        return {\n",
    "            \"success\": True,\n",
    "            \"skill_id\": skill.id,\n",
    "            \"display_title\": skill.display_title,\n",
    "            \"latest_version\": skill.latest_version,\n",
    "            \"created_at\": skill.created_at,\n",
    "            \"source\": skill.source,\n",
    "        }\n",
    "    except Exception as e:\n",
    "        return {\"success\": False, \"error\": str(e)}\n",
    "\n",
    "\n",
    "def list_custom_skills(client: Anthropic) -> list[dict[str, Any]]:\n",
    "    \"\"\"\n",
    "    List all custom skills in the workspace.\n",
    "\n",
    "    Returns:\n",
    "        List of skill dictionaries\n",
    "    \"\"\"\n",
    "    try:\n",
    "        skills_response = client.beta.skills.list(source=\"custom\")\n",
    "\n",
    "        skills = []\n",
    "        for skill in skills_response.data:\n",
    "            skills.append(\n",
    "                {\n",
    "                    \"skill_id\": skill.id,\n",
    "                    \"display_title\": skill.display_title,\n",
    "                    \"latest_version\": skill.latest_version,\n",
    "                    \"created_at\": skill.created_at,\n",
    "                    \"updated_at\": skill.updated_at,\n",
    "                }\n",
    "            )\n",
    "\n",
    "        return skills\n",
    "    except Exception as e:\n",
    "        print(f\"Error listing skills: {e}\")\n",
    "        return []\n",
    "\n",
    "\n",
    "def delete_skill(client: Anthropic, skill_id: str) -> bool:\n",
    "    \"\"\"\n",
    "    Delete a custom skill and all its versions.\n",
    "\n",
    "    Args:\n",
    "        client: Anthropic client\n",
    "        skill_id: ID of skill to delete\n",
    "\n",
    "    Returns:\n",
    "        True if successful, False otherwise\n",
    "    \"\"\"\n",
    "    try:\n",
    "        # First delete all versions\n",
    "        versions = client.beta.skills.versions.list(skill_id=skill_id)\n",
    "\n",
    "        for version in versions.data:\n",
    "            client.beta.skills.versions.delete(skill_id=skill_id, version=version.version)\n",
    "\n",
    "        # Then delete the skill itself\n",
    "        client.beta.skills.delete(skill_id)\n",
    "        return True\n",
    "\n",
    "    except Exception as e:\n",
    "        print(f\"Error deleting skill: {e}\")\n",
    "        return False\n",
    "\n",
    "\n",
    "def test_skill(\n",
    "    client: Anthropic,\n",
    "    skill_id: str,\n",
    "    test_prompt: str,\n",
    "    model: str = \"claude-sonnet-4-5\",\n",
    ") -> Any:\n",
    "    \"\"\"\n",
    "    Test a custom skill with a prompt.\n",
    "\n",
    "    Args:\n",
    "        client: Anthropic client\n",
    "        skill_id: ID of skill to test\n",
    "        test_prompt: Prompt to test the skill\n",
    "        model: Model to use for testing\n",
    "\n",
    "    Returns:\n",
    "        Response from Claude\n",
    "    \"\"\"\n",
    "    response = client.beta.messages.create(\n",
    "        model=model,\n",
    "        max_tokens=4096,\n",
    "        container={\"skills\": [{\"type\": \"custom\", \"skill_id\": skill_id, \"version\": \"latest\"}]},\n",
    "        tools=[{\"type\": \"code_execution_20250825\", \"name\": \"code_execution\"}],\n",
    "        messages=[{\"role\": \"user\", \"content\": test_prompt}],\n",
    "        betas=[\n",
    "            \"code-execution-2025-08-25\",\n",
    "            \"files-api-2025-04-14\",\n",
    "            \"skills-2025-10-02\",\n",
    "        ],\n",
    "    )\n",
    "\n",
    "    return response\n",
    "\n",
    "\n",
    "print(\"✓ Skill utility functions defined\")\n",
    "print(\"  - create_skill()\")\n",
    "print(\"  - list_custom_skills()\")\n",
    "print(\"  - delete_skill()\")\n",
    "print(\"  - test_skill()\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Check Existing Custom Skills\n",
    "\n",
    "Let's see if any custom skills already exist in your workspace:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### ⚠️ Important: Clean Up Existing Skills Before Starting\n",
    "\n",
    "If you're re-running this notebook, you may have skills from a previous session. Skills cannot have duplicate display titles, so you have three options:\n",
    "\n",
    "1. **Delete existing skills** (recommended for testing) - Clean slate approach\n",
    "2. **Use different display titles** - Add timestamps or version numbers to names\n",
    "3. **Update existing skills with new versions** - See [Skill Management & Versioning](#management) section\n",
    "\n",
    "Let's check for and optionally clean up existing skills:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Check for existing skills that might conflict\n",
    "existing_skills = list_custom_skills(client)\n",
    "skill_titles_to_create = [\n",
    "    \"Financial Ratio Analyzer\",\n",
    "    \"Corporate Brand Guidelines\",\n",
    "    \"Financial Modeling Suite\",\n",
    "]\n",
    "conflicting_skills = []\n",
    "\n",
    "if existing_skills:\n",
    "    print(f\"Found {len(existing_skills)} existing custom skill(s):\")\n",
    "    for skill in existing_skills:\n",
    "        print(f\"  - {skill['display_title']} (ID: {skill['skill_id']})\")\n",
    "        if skill[\"display_title\"] in skill_titles_to_create:\n",
    "            conflicting_skills.append(skill)\n",
    "\n",
    "    if conflicting_skills:\n",
    "        print(\n",
    "            f\"\\n⚠️ Found {len(conflicting_skills)} skill(s) that will conflict with this notebook:\"\n",
    "        )\n",
    "        for skill in conflicting_skills:\n",
    "            print(f\"  - {skill['display_title']} (ID: {skill['skill_id']})\")\n",
    "\n",
    "        print(\"\\n\" + \"=\" * 70)\n",
    "        print(\"To clean up these skills and start fresh, uncomment and run:\")\n",
    "        print(\"=\" * 70)\n",
    "        print(\"\\n# UNCOMMENT THE LINES BELOW TO DELETE CONFLICTING SKILLS:\")\n",
    "        print(\"# for skill in conflicting_skills:\")\n",
    "        print(\"#     if delete_skill(client, skill['skill_id']):\")\n",
    "        print(\"#         print(f\\\"✅ Deleted: {skill['display_title']}\\\")\")\n",
    "        print(\"#     else:\")\n",
    "        print(\"#         print(f\\\"❌ Failed to delete: {skill['display_title']}\\\")\")\n",
    "\n",
    "        # for skill in conflicting_skills:\n",
    "        #     if delete_skill(client, skill['skill_id']):\n",
    "        #         print(f\"✅ Deleted: {skill['display_title']}\")\n",
    "        #     else:\n",
    "        #         print(f\"❌ Failed to delete: {skill['display_title']}\")\n",
    "    else:\n",
    "        print(\"\\n✅ No conflicting skills found. Ready to proceed!\")\n",
    "else:\n",
    "    print(\"✅ No existing custom skills found. Ready to create new ones!\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. Example 1: Financial Ratio Calculator {#financial-ratio}\n",
    "\n",
    "Let's create our first custom skill - a financial ratio calculator that can analyze company financial health.\n",
    "\n",
    "### Skill Overview\n",
    "\n",
    "The **Financial Ratio Calculator** skill will:\n",
    "- Calculate key financial ratios (ROE, P/E, Current Ratio, etc.)\n",
    "- Interpret ratios with industry context\n",
    "- Generate formatted reports\n",
    "- Work with various data formats (CSV, JSON, text)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Upload the Financial Analyzer Skill\n",
    "\n",
    "Now let's upload our financial analyzer skill to Claude:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Upload the Financial Analyzer skill\n",
    "financial_skill_path = SKILLS_DIR / \"analyzing-financial-statements\"\n",
    "\n",
    "if financial_skill_path.exists():\n",
    "    print(\"Uploading Financial Analyzer skill...\")\n",
    "    result = create_skill(client, str(financial_skill_path), \"Financial Ratio Analyzer\")\n",
    "\n",
    "    if result[\"success\"]:\n",
    "        financial_skill_id = result[\"skill_id\"]\n",
    "        print(\"✅ Skill uploaded successfully!\")\n",
    "        print(f\"   Skill ID: {financial_skill_id}\")\n",
    "        print(f\"   Version: {result['latest_version']}\")\n",
    "        print(f\"   Created: {result['created_at']}\")\n",
    "    else:\n",
    "        print(f\"❌ Upload failed: {result['error']}\")\n",
    "        if \"cannot reuse an existing display_title\" in str(result[\"error\"]):\n",
    "            print(\"\\n💡 Solution: A skill with this name already exists.\")\n",
    "            print(\"   Run the 'Clean Up Existing Skills' cell above to delete it first,\")\n",
    "            print(\"   or change the display_title to something unique.\")\n",
    "else:\n",
    "    print(f\"⚠️ Skill directory not found: {financial_skill_path}\")\n",
    "    print(\n",
    "        \"Please ensure the custom_skills directory contains the analyzing-financial-statements folder.\"\n",
    "    )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Test the Financial Analyzer Skill\n",
    "\n",
    "Let's test the skill with sample financial data:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Test the Financial Analyzer skill\n",
    "if \"financial_skill_id\" in locals():\n",
    "    test_prompt = \"\"\"\n",
    "    Calculate financial ratios for this company:\n",
    "\n",
    "    Income Statement:\n",
    "    - Revenue: $1,000M\n",
    "    - EBITDA: $200M\n",
    "    - Net Income: $120M\n",
    "\n",
    "    Balance Sheet:\n",
    "    - Total Assets: $2,000M\n",
    "    - Current Assets: $500M\n",
    "    - Current Liabilities: $300M\n",
    "    - Total Debt: $400M\n",
    "    - Shareholders Equity: $1,200M\n",
    "\n",
    "    Market Data:\n",
    "    - Share Price: $50\n",
    "    - Shares Outstanding: 100M\n",
    "\n",
    "    Please calculate key ratios and provide analysis.\n",
    "    \"\"\"\n",
    "\n",
    "    print(\"Testing Financial Analyzer skill...\")\n",
    "    response = test_skill(client, financial_skill_id, test_prompt)\n",
    "\n",
    "    # Print response\n",
    "    for content in response.content:\n",
    "        if content.type == \"text\":\n",
    "            print(content.text)\n",
    "else:\n",
    "    print(\"⚠️ Please upload the Financial Analyzer skill first (run the previous cell)\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4. Example 2: Company Brand Guidelines {#brand-guidelines}\n",
    "\n",
    "Now let's create a skill that ensures all documents follow corporate brand standards.\n",
    "\n",
    "### Skill Overview\n",
    "\n",
    "The **Brand Guidelines** skill will:\n",
    "- Apply consistent colors, fonts, and layouts\n",
    "- Ensure logo placement and usage\n",
    "- Maintain professional tone and messaging\n",
    "- Work across all document types (Excel, PowerPoint, PDF)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Upload the Brand Guidelines skill\n",
    "brand_skill_path = SKILLS_DIR / \"applying-brand-guidelines\"\n",
    "\n",
    "if brand_skill_path.exists():\n",
    "    print(\"Uploading Brand Guidelines skill...\")\n",
    "    result = create_skill(client, str(brand_skill_path), \"Corporate Brand Guidelines\")\n",
    "\n",
    "    if result[\"success\"]:\n",
    "        brand_skill_id = result[\"skill_id\"]\n",
    "        print(\"✅ Skill uploaded successfully!\")\n",
    "        print(f\"   Skill ID: {brand_skill_id}\")\n",
    "        print(f\"   Version: {result['latest_version']}\")\n",
    "    else:\n",
    "        print(f\"❌ Upload failed: {result['error']}\")\n",
    "        if \"cannot reuse an existing display_title\" in str(result[\"error\"]):\n",
    "            print(\"\\n💡 Solution: A skill with this name already exists.\")\n",
    "            print(\"   Run the 'Clean Up Existing Skills' cell above to delete it first,\")\n",
    "            print(\"   or change the display_title to something unique.\")\n",
    "else:\n",
    "    print(f\"⚠️ Skill directory not found: {brand_skill_path}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Test Brand Guidelines with Document Creation\n",
    "\n",
    "Let's test the brand skill by creating a branded PowerPoint presentation:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Test Brand Guidelines skill with PowerPoint creation\n",
    "if \"brand_skill_id\" in locals():\n",
    "    # Combine brand skill with Anthropic's pptx skill\n",
    "    response = client.beta.messages.create(\n",
    "        model=MODEL,\n",
    "        max_tokens=4096,\n",
    "        container={\n",
    "            \"skills\": [\n",
    "                {\"type\": \"custom\", \"skill_id\": brand_skill_id, \"version\": \"latest\"},\n",
    "                {\"type\": \"anthropic\", \"skill_id\": \"pptx\", \"version\": \"latest\"},\n",
    "            ]\n",
    "        },\n",
    "        tools=[{\"type\": \"code_execution_20250825\", \"name\": \"code_execution\"}],\n",
    "        messages=[\n",
    "            {\n",
    "                \"role\": \"user\",\n",
    "                \"content\": \"\"\"Create a 3-slide PowerPoint presentation following Acme Corporation brand guidelines:\n",
    "\n",
    "            Slide 1: Title slide for \"Q4 2025 Results\"\n",
    "            Slide 2: Revenue Overview with a chart showing Q1-Q4 growth\n",
    "            Slide 3: Key Achievements (3 bullet points)\n",
    "\n",
    "            Apply all brand colors, fonts, and formatting standards.\n",
    "            \"\"\",\n",
    "            }\n",
    "        ],\n",
    "        betas=[\n",
    "            \"code-execution-2025-08-25\",\n",
    "            \"files-api-2025-04-14\",\n",
    "            \"skills-2025-10-02\",\n",
    "        ],\n",
    "    )\n",
    "\n",
    "    print(\"Response from Claude:\")\n",
    "    for content in response.content:\n",
    "        if content.type == \"text\":\n",
    "            print(content.text[:500] + \"...\" if len(content.text) > 500 else content.text)\n",
    "\n",
    "    # Download generated file\n",
    "    file_ids = extract_file_ids(response)\n",
    "    if file_ids:\n",
    "        results = download_all_files(\n",
    "            client, response, output_dir=str(OUTPUT_DIR), prefix=\"branded_\"\n",
    "        )\n",
    "        print_download_summary(results)\n",
    "else:\n",
    "    print(\"⚠️ Please upload the Brand Guidelines skill first\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5. Example 3: Financial Modeling Suite {#financial-modeling}\n",
    "\n",
    "Let's create our most advanced skill - a comprehensive financial modeling suite for valuation and risk analysis.\n",
    "\n",
    "### Skill Overview\n",
    "\n",
    "The **Financial Modeling Suite** skill provides:\n",
    "- **DCF Valuation**: Complete discounted cash flow models\n",
    "- **Sensitivity Analysis**: Test impact of variables on valuation\n",
    "- **Monte Carlo Simulation**: Risk modeling with probability distributions\n",
    "- **Scenario Planning**: Best/base/worst case analysis\n",
    "\n",
    "This demonstrates a multi-file skill with complex calculations and professional-grade financial modeling."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Upload the Financial Modeling Suite \n",
    "\n",
    "First, upload the financial modeling skill:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Upload the Financial Modeling Suite skill\n",
    "modeling_skill_path = SKILLS_DIR / \"creating-financial-models\"\n",
    "\n",
    "if modeling_skill_path.exists():\n",
    "    print(\"Uploading Financial Modeling Suite skill...\")\n",
    "    result = create_skill(client, str(modeling_skill_path), \"Financial Modeling Suite\")\n",
    "\n",
    "    if result[\"success\"]:\n",
    "        modeling_skill_id = result[\"skill_id\"]\n",
    "        print(\"✅ Skill uploaded successfully!\")\n",
    "        print(f\"   Skill ID: {modeling_skill_id}\")\n",
    "        print(f\"   Version: {result['latest_version']}\")\n",
    "        print(\"\\nThis skill includes:\")\n",
    "        print(\"   - DCF valuation model (dcf_model.py)\")\n",
    "        print(\"   - Sensitivity analysis framework (sensitivity_analysis.py)\")\n",
    "        print(\"   - Monte Carlo simulation capabilities\")\n",
    "        print(\"   - Scenario planning tools\")\n",
    "    else:\n",
    "        print(f\"❌ Upload failed: {result['error']}\")\n",
    "else:\n",
    "    print(f\"⚠️ Skill directory not found: {modeling_skill_path}\")\n",
    "    print(\n",
    "        \"Please ensure the custom_skills directory contains the creating-financial-models folder.\"\n",
    "    )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Test the Financial Modeling Suite\n",
    "\n",
    "Let's test the advanced modeling capabilities with a DCF valuation request:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Test the Financial Modeling Suite with a DCF valuation\n",
    "if \"modeling_skill_id\" in locals():\n",
    "    dcf_test_prompt = \"\"\"\n",
    "    Perform a DCF valuation for TechCorp with the following data:\n",
    "\n",
    "    Historical Financials (Last 3 Years):\n",
    "    - Revenue: $500M, $600M, $750M\n",
    "    - EBITDA Margin: 25%, 27%, 30%\n",
    "    - CapEx: $50M, $55M, $60M\n",
    "    - Working Capital: 15% of revenue\n",
    "\n",
    "    Projections:\n",
    "    - Revenue growth: 20% for years 1-3, then declining to 5% by year 5\n",
    "    - EBITDA margin expanding to 35% by year 5\n",
    "    - Terminal growth rate: 3%\n",
    "\n",
    "    Market Assumptions:\n",
    "    - WACC: 10%\n",
    "    - Tax rate: 25%\n",
    "    - Current net debt: $200M\n",
    "    - Shares outstanding: 100M\n",
    "\n",
    "    Please create a complete DCF model with sensitivity analysis on WACC and terminal growth.\n",
    "    Generate an Excel file with the full model including:\n",
    "    1. Revenue projections\n",
    "    2. Free cash flow calculations\n",
    "    3. Terminal value\n",
    "    4. Enterprise value to equity value bridge\n",
    "    5. Sensitivity table\n",
    "    \"\"\"\n",
    "\n",
    "    print(\"Testing Financial Modeling Suite with DCF valuation...\")\n",
    "    print(\"=\" * 70)\n",
    "    print(\"\\n⏱️ Note: Complex financial model generation may take 1-2 minutes.\\n\")\n",
    "\n",
    "    response = client.beta.messages.create(\n",
    "        model=MODEL,\n",
    "        max_tokens=4096,\n",
    "        container={\n",
    "            \"skills\": [\n",
    "                {\"type\": \"custom\", \"skill_id\": modeling_skill_id, \"version\": \"latest\"},\n",
    "                {\"type\": \"anthropic\", \"skill_id\": \"xlsx\", \"version\": \"latest\"},\n",
    "            ]\n",
    "        },\n",
    "        tools=[{\"type\": \"code_execution_20250825\", \"name\": \"code_execution\"}],\n",
    "        messages=[{\"role\": \"user\", \"content\": dcf_test_prompt}],\n",
    "        betas=[\n",
    "            \"code-execution-2025-08-25\",\n",
    "            \"files-api-2025-04-14\",\n",
    "            \"skills-2025-10-02\",\n",
    "        ],\n",
    "    )\n",
    "\n",
    "    # Print Claude's response\n",
    "    for content in response.content:\n",
    "        if content.type == \"text\":\n",
    "            # Print first 800 characters to keep output manageable\n",
    "            text = content.text\n",
    "            if len(text) > 800:\n",
    "                print(text[:800] + \"\\n\\n[... Output truncated for brevity ...]\")\n",
    "            else:\n",
    "                print(text)\n",
    "\n",
    "    # Download the DCF model if generated\n",
    "    file_ids = extract_file_ids(response)\n",
    "    if file_ids:\n",
    "        print(\"\\n\" + \"=\" * 70)\n",
    "        print(\"Downloading generated DCF model...\")\n",
    "        results = download_all_files(\n",
    "            client, response, output_dir=str(OUTPUT_DIR), prefix=\"dcf_model_\"\n",
    "        )\n",
    "        print_download_summary(results)\n",
    "        print(\"\\n💡 Open the Excel file to explore the complete DCF valuation model!\")\n",
    "else:\n",
    "    print(\"⚠️ Please upload the Financial Modeling Suite skill first (run the previous cell)\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 6. Skill Management & Versioning {#management}\n",
    "\n",
    "Managing skills over time requires understanding versioning, updates, and lifecycle management.\n",
    "\n",
    "### Listing Your Skills\n",
    "\n",
    "Get an overview of all custom skills in your workspace:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# List all your custom skills\n",
    "my_skills = list_custom_skills(client)\n",
    "\n",
    "if my_skills:\n",
    "    print(f\"You have {len(my_skills)} custom skill(s):\\n\")\n",
    "    print(\"=\" * 70)\n",
    "    for i, skill in enumerate(my_skills, 1):\n",
    "        print(f\"\\n{i}. {skill['display_title']}\")\n",
    "        print(f\"   Skill ID: {skill['skill_id']}\")\n",
    "        print(f\"   Current Version: {skill['latest_version']}\")\n",
    "        print(f\"   Created: {skill['created_at']}\")\n",
    "        if skill.get(\"updated_at\"):\n",
    "            print(f\"   Last Updated: {skill['updated_at']}\")\n",
    "    print(\"\\n\" + \"=\" * 70)\n",
    "else:\n",
    "    print(\"No custom skills found in your workspace.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Creating New Versions\n",
    "\n",
    "Skills support versioning to maintain history and enable rollback. Let's make an enhancement to our Financial Analyzer skill and create a new version.\n",
    "\n",
    "#### Step 1: Enhance the Financial Analyzer\n",
    "\n",
    "We'll add **healthcare industry** benchmarks to make our skill more versatile. This is a real-world scenario where you'd expand a skill's capabilities based on user needs."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Add healthcare industry benchmarks to the Financial Analyzer\n",
    "# This demonstrates a realistic skill enhancement scenario\n",
    "\n",
    "if \"financial_skill_id\" in locals():\n",
    "    # Read the current interpret_ratios.py file\n",
    "    interpret_file_path = SKILLS_DIR / \"analyzing-financial-statements\" / \"interpret_ratios.py\"\n",
    "\n",
    "    with open(interpret_file_path) as f:\n",
    "        content = f.read()\n",
    "\n",
    "    # Add healthcare benchmarks after the 'manufacturing' section\n",
    "    healthcare_benchmarks = \"\"\"        },\n",
    "        'healthcare': {\n",
    "            'current_ratio': {'excellent': 2.3, 'good': 1.8, 'acceptable': 1.4, 'poor': 1.0},\n",
    "            'debt_to_equity': {'excellent': 0.3, 'good': 0.6, 'acceptable': 1.0, 'poor': 1.8},\n",
    "            'roe': {'excellent': 0.22, 'good': 0.16, 'acceptable': 0.11, 'poor': 0.07},\n",
    "            'gross_margin': {'excellent': 0.65, 'good': 0.45, 'acceptable': 0.30, 'poor': 0.20},\n",
    "            'pe_ratio': {'undervalued': 18, 'fair': 28, 'growth': 40, 'expensive': 55}\n",
    "        \"\"\"\n",
    "\n",
    "    # Find the position after manufacturing section and before the closing brace\n",
    "    insert_pos = content.find(\"        }\\n    }\")  # Find the end of the BENCHMARKS dict\n",
    "\n",
    "    if insert_pos != -1:\n",
    "        # Insert the healthcare benchmarks\n",
    "        new_content = content[:insert_pos] + healthcare_benchmarks + content[insert_pos:]\n",
    "\n",
    "        # Save the enhanced file\n",
    "        with open(interpret_file_path, \"w\") as f:\n",
    "            f.write(new_content)\n",
    "\n",
    "        print(\"✅ Enhanced Financial Analyzer with healthcare industry benchmarks\")\n",
    "        print(\"\\nChanges made:\")\n",
    "        print(\"  - Added healthcare industry to BENCHMARKS\")\n",
    "        print(\"  - Includes specific thresholds for:\")\n",
    "        print(\"    • Current ratio (liquidity)\")\n",
    "        print(\"    • Debt-to-equity (leverage)\")\n",
    "        print(\"    • ROE (profitability)\")\n",
    "        print(\"    • Gross margin\")\n",
    "        print(\"    • P/E ratio (valuation)\")\n",
    "        print(\"\\n📝 Now we can create a new version of the skill with this enhancement!\")\n",
    "    else:\n",
    "        print(\"⚠️ Could not find the correct position to insert healthcare benchmarks\")\n",
    "        print(\"The file structure may have changed.\")\n",
    "else:\n",
    "    print(\"⚠️ Please upload the Financial Analyzer skill first (run cells in Section 3)\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Step 2: Create a New Version\n",
    "\n",
    "Now that we've enhanced our skill, let's create a new version to track this change:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Create a new version of the enhanced Financial Analyzer skill\n",
    "def create_skill_version(client: Anthropic, skill_id: str, skill_path: str):\n",
    "    \"\"\"Create a new version of an existing skill.\"\"\"\n",
    "    try:\n",
    "        version = client.beta.skills.versions.create(\n",
    "            skill_id=skill_id, files=files_from_dir(skill_path)\n",
    "        )\n",
    "        return {\n",
    "            \"success\": True,\n",
    "            \"version\": version.version,\n",
    "            \"created_at\": version.created_at,\n",
    "        }\n",
    "    except Exception as e:\n",
    "        return {\"success\": False, \"error\": str(e)}\n",
    "\n",
    "\n",
    "# Create the new version with our healthcare enhancement\n",
    "if \"financial_skill_id\" in locals():\n",
    "    print(\"Creating new version of Financial Analyzer with healthcare benchmarks...\")\n",
    "\n",
    "    result = create_skill_version(\n",
    "        client, financial_skill_id, str(SKILLS_DIR / \"analyzing-financial-statements\")\n",
    "    )\n",
    "\n",
    "    if result[\"success\"]:\n",
    "        print(\"✅ New version created successfully!\")\n",
    "        print(f\"   Version: {result['version']}\")\n",
    "        print(f\"   Created: {result['created_at']}\")\n",
    "        print(\"\\n📊 Version History:\")\n",
    "        print(\"   v1: Original skill with tech, retail, financial, manufacturing\")\n",
    "        print(f\"   v{result['version']}: Enhanced with healthcare industry benchmarks\")\n",
    "    else:\n",
    "        print(f\"❌ Version creation failed: {result['error']}\")\n",
    "else:\n",
    "    print(\"⚠️ Please run the previous cells to upload the skill and make enhancements first\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Step 3: Test the New Version\n",
    "\n",
    "Let's verify our enhancement works by analyzing a healthcare company:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Test the enhanced skill with healthcare industry data\n",
    "if \"financial_skill_id\" in locals():\n",
    "    healthcare_test_prompt = \"\"\"\n",
    "    Analyze this healthcare company using the healthcare industry benchmarks:\n",
    "\n",
    "    Company: MedTech Solutions (Healthcare Industry)\n",
    "\n",
    "    Income Statement:\n",
    "    - Revenue: $800M\n",
    "    - EBITDA: $320M\n",
    "    - Net Income: $160M\n",
    "\n",
    "    Balance Sheet:\n",
    "    - Total Assets: $1,200M\n",
    "    - Current Assets: $400M\n",
    "    - Current Liabilities: $200M\n",
    "    - Total Debt: $300M\n",
    "    - Shareholders Equity: $700M\n",
    "\n",
    "    Market Data:\n",
    "    - Share Price: $75\n",
    "    - Shares Outstanding: 50M\n",
    "\n",
    "    Please calculate key ratios and provide healthcare-specific analysis.\n",
    "    \"\"\"\n",
    "\n",
    "    print(\"Testing enhanced Financial Analyzer with healthcare company...\")\n",
    "    print(\"=\" * 70)\n",
    "\n",
    "    response = test_skill(client, financial_skill_id, healthcare_test_prompt, MODEL)\n",
    "\n",
    "    # Print Claude's analysis\n",
    "    for content in response.content:\n",
    "        if content.type == \"text\":\n",
    "            # Print first 1000 characters to keep output manageable\n",
    "            text = content.text\n",
    "            if len(text) > 1000:\n",
    "                print(text[:1000] + \"\\n\\n[... Output truncated for brevity ...]\")\n",
    "            else:\n",
    "                print(text)\n",
    "\n",
    "    print(\n",
    "        \"\\n✅ The skill now recognizes 'healthcare' as an industry and applies specific benchmarks!\"\n",
    "    )\n",
    "else:\n",
    "    print(\"⚠️ Please run the previous cells to create the enhanced version first\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Cleanup: Managing Your Skills\n",
    "\n",
    "When you're done testing or need to clean up your workspace, you can selectively remove skills. Let's review what we've created and provide options for cleanup:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Comprehensive skill cleanup with detailed reporting\n",
    "def review_and_cleanup_skills(client, dry_run=True):\n",
    "    \"\"\"\n",
    "    Review all skills and optionally clean up the ones created in this notebook.\n",
    "\n",
    "    Args:\n",
    "        client: Anthropic client\n",
    "        dry_run: If True, only show what would be deleted without actually deleting\n",
    "    \"\"\"\n",
    "    # Get all current skills\n",
    "    all_skills = list_custom_skills(client)\n",
    "\n",
    "    # Skills we created in this notebook\n",
    "    notebook_skill_names = [\n",
    "        \"Financial Ratio Analyzer\",\n",
    "        \"Corporate Brand Guidelines\",\n",
    "        \"Financial Modeling Suite\",\n",
    "    ]\n",
    "\n",
    "    # Track skills created by this notebook\n",
    "    notebook_skills = []\n",
    "    other_skills = []\n",
    "\n",
    "    for skill in all_skills:\n",
    "        if skill[\"display_title\"] in notebook_skill_names:\n",
    "            notebook_skills.append(skill)\n",
    "        else:\n",
    "            other_skills.append(skill)\n",
    "\n",
    "    print(\"=\" * 70)\n",
    "    print(\"SKILL INVENTORY REPORT\")\n",
    "    print(\"=\" * 70)\n",
    "\n",
    "    print(f\"\\nTotal custom skills in workspace: {len(all_skills)}\")\n",
    "\n",
    "    if notebook_skills:\n",
    "        print(f\"\\n📚 Skills created by this notebook ({len(notebook_skills)}):\")\n",
    "        for skill in notebook_skills:\n",
    "            print(f\"   • {skill['display_title']}\")\n",
    "            print(f\"     ID: {skill['skill_id']}\")\n",
    "            print(f\"     Version: {skill['latest_version']}\")\n",
    "            print(f\"     Created: {skill['created_at']}\")\n",
    "    else:\n",
    "        print(\"\\n✅ No skills from this notebook found\")\n",
    "\n",
    "    if other_skills:\n",
    "        print(f\"\\n🔧 Other skills in workspace ({len(other_skills)}):\")\n",
    "        for skill in other_skills:\n",
    "            print(f\"   • {skill['display_title']} (v{skill['latest_version']})\")\n",
    "\n",
    "    # Cleanup options\n",
    "    if notebook_skills:\n",
    "        print(\"\\n\" + \"=\" * 70)\n",
    "        print(\"CLEANUP OPTIONS\")\n",
    "        print(\"=\" * 70)\n",
    "\n",
    "        if dry_run:\n",
    "            print(\"\\n🔍 DRY RUN MODE - No skills will be deleted\")\n",
    "            print(\"\\nTo delete the notebook skills, uncomment and run:\")\n",
    "            print(\"-\" * 40)\n",
    "            print(\"# review_and_cleanup_skills(client, dry_run=False)\")\n",
    "            print(\"-\" * 40)\n",
    "\n",
    "            print(\"\\nThis would delete:\")\n",
    "            for skill in notebook_skills:\n",
    "                print(f\"   • {skill['display_title']}\")\n",
    "        else:\n",
    "            print(\"\\n⚠️ DELETION MODE - Skills will be permanently removed\")\n",
    "            print(\"\\nDeleting notebook skills...\")\n",
    "\n",
    "            success_count = 0\n",
    "            for skill in notebook_skills:\n",
    "                if delete_skill(client, skill[\"skill_id\"]):\n",
    "                    print(f\"   ✅ Deleted: {skill['display_title']}\")\n",
    "                    success_count += 1\n",
    "                else:\n",
    "                    print(f\"   ❌ Failed to delete: {skill['display_title']}\")\n",
    "\n",
    "            print(f\"\\n📊 Cleanup complete: {success_count}/{len(notebook_skills)} skills deleted\")\n",
    "\n",
    "    return {\n",
    "        \"total_skills\": len(all_skills),\n",
    "        \"notebook_skills\": len(notebook_skills),\n",
    "        \"other_skills\": len(other_skills),\n",
    "        \"notebook_skill_ids\": [s[\"skill_id\"] for s in notebook_skills],\n",
    "    }\n",
    "\n",
    "\n",
    "# Run the review (in dry-run mode by default)\n",
    "print(\"Reviewing your custom skills workspace...\")\n",
    "cleanup_summary = review_and_cleanup_skills(client, dry_run=True)\n",
    "\n",
    "# Store skill IDs for potential cleanup\n",
    "if cleanup_summary[\"notebook_skill_ids\"]:\n",
    "    skills_to_cleanup = cleanup_summary[\"notebook_skill_ids\"]\n",
    "    print(f\"\\n💡 Tip: {len(skills_to_cleanup)} skill(s) can be cleaned up when you're done testing\")\n",
    "\n",
    "# UNCOMMENT THE LINE BELOW TO ACTUALLY DELETE THE NOTEBOOK SKILLS:\n",
    "# review_and_cleanup_skills(client, dry_run=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": "## 7. Best Practices & Production Tips {#best-practices}\n\n### Skill Design Principles\n\n1. **Single Responsibility**: Each skill should focus on one area of expertise\n2. **Clear Documentation**: SKILL.md should be comprehensive yet concise\n3. **Error Handling**: Scripts should handle edge cases gracefully\n4. **Version Control**: Use Git to track skill changes\n5. **Testing**: Always test skills before production deployment\n\n### Directory Structure Best Practices\n\n```\ncustom_skills/\n├── financial_analyzer/       # Single purpose, clear naming\n│   ├── SKILL.md             # Under 5,000 tokens\n│   ├── scripts/             # Modular Python/JS files\n│   └── tests/               # Unit tests for scripts\n├── brand_guidelines/         # Organizational standards\n│   ├── SKILL.md\n│   ├── REFERENCE.md         # Additional documentation\n│   └── assets/              # Logos, templates\n```\n\n### Performance Optimization\n\n| Strategy | Impact | Implementation |\n|----------|--------|----------------|\n| **Minimal Frontmatter** | Faster skill discovery | name: 64 chars, description: 1024 chars |\n| **Lazy Loading** | Reduced token usage | Reference files only when needed |\n| **Skill Composition** | Avoid duplication | Combine skills vs. mega-skill |\n| **Caching** | Faster responses | Reuse skill containers |\n\n### Security Considerations\n\n- **API Keys**: Never hardcode credentials in skills\n- **Data Privacy**: Don't include sensitive data in skill files\n- **Access Control**: Skills are workspace-specific\n- **Validation**: Sanitize inputs in scripts\n- **Audit Trail**: Log skill usage for compliance"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": "## Next Steps\n\n🎉 **Congratulations!** You've learned how to create, deploy, and manage custom skills for Claude.\n\n### What You've Learned\n\n- ✅ Custom skill architecture and requirements\n- ✅ Creating skills with SKILL.md and Python scripts\n- ✅ Uploading skills via the API\n- ✅ Combining custom and Anthropic skills\n- ✅ Best practices for production deployment\n- ✅ Troubleshooting common issues\n\n### Continue Your Journey\n\n1. **Experiment**: Modify the example skills for your use cases\n2. **Build**: Create skills for your organization's workflows\n3. **Optimize**: Monitor token usage and performance\n4. **Share**: Document your skills for team collaboration\n\n### Resources\n\n- [Claude API Documentation](https://docs.anthropic.com/en/api/messages)\n- [Skills Documentation](https://docs.claude.com/en/docs/agents-and-tools/agent-skills/overview)\n- [Best Practices](https://docs.claude.com/en/docs/agents-and-tools/agent-skills/best-practices)\n- [Files API Documentation](https://docs.claude.com/en/api/files-content)\n- Example Skills Repository (coming soon)\n\n### Skill Ideas to Try\n\n- 📊 **Data Pipeline**: ETL workflows with validation\n- 📝 **Document Templates**: Contracts, proposals, reports\n- 🔍 **Code Review**: Style guides and best practices\n- 📈 **Analytics Dashboard**: KPI tracking and visualization\n- 🤖 **Automation Suite**: Repetitive task workflows\n\nHappy skill building! 🚀"
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "venv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}